// 请求地址
const getBaseURL = () => {
  let baseURL = ''
  baseURL = 'http://localhost:8080/api'
  return baseURL
}

// 第一个请求的公共参数
export const headerConfig = {
  headers: {
    // 白名单设置
    appid: "a588bd9d01ecc75dbbaaefce",
  },
};

/**
 * 这里是设置公共头部参数信息
 * @param {*} options
 * @returns
 */
export function useGetFetchOptions(options = {}) {
  options.baseURL = options.baseURL ?? getBaseURL();
  options.headers = options.headers ?? {
    appid: headerConfig.headers.appid,
  };

  options.initialCache = options.initialCache ?? false;
  //options.cache = 'no-cache'
  options.lazy = options.lazy ?? false;
  // 用户登录的情况下就获取token写入头部信息。如果没有登录就不写入
  const token = useCache("TOKEN").getCache();
  if (token.value) {
    options.headers.Authorization = token.value;
  }

  // 禁止响应式
  if (options.body && !options.isupload) {
    const rawBody = toRaw(options.body);
    options.body = typeof rawBody === "object" ? {...rawBody} : rawBody;
  }

  return options;
}

/**
 * 处理异步请求的方法
 * @param {*} key
 * @param {*} url
 * @param {*} options
 * @returns
 */
export async function useHttp(url, options = {}) {
  options = useGetFetchOptions(options);
  // 用一个延迟阻塞的方式解决问题，
  await nextTick();
  // 这里就是真正请求发起的地方--------------------------重点
  //$fetch---缓存功能--如果你url没有变化，那么是直接从浏览器缓存中去获取 url----data
  let res = await useFetch(url, {
    ...options,
    // 相当于响应拦截器
    transform: (res) => {
      return res;
    },
  });

  // 客户端错误处理
  if (process.client && res.error.value) {
    const msg = res.error.value?.data?.data;
    const statusCode = res.error.value.statusCode
    if (!options.lazy && statusCode == 500) {
      useMessage().error(msg || "服务端错误");
      useLoading().finish()
    }

    if (!options.lazy && statusCode == 404) {
      useMessage().error(msg || "请求资源不存在");
      useLoading().finish()
    }
  }
  // 服务端的错误
  return res.data.value.code === 20000 ? Promise.resolve(res.data.value) : Promise.reject(res.data.value);
}

/**
 * GET请求
 * @param {*} url  请求业务
 * @param {*} options 请求的参数
 * @returns
 */
export function useHttpGet(url, options = {}) {
  options.method = "GET"
  options.isupload = false
  return useHttp(url, options)
}

/**
 * POST请求
 * @param {*} url  请求业务
 * @param {*} options 请求的参数和头部信息
 * @returns
 */
export function useHttpPost(url, options = {}) {
  options.method = "POST"
  options.isupload = false
  return useHttp(url, options)
}

/**
 * POST请求--文件上传
 * @param {*} url  请求业务
 * @param {*} options 请求的参数和头部信息
 * @returns
 */
export function useHttpUpload(url, options = {}) {
  options.method = "POST"
  options.isupload = true
  return useHttp(url, options)
}
